package com.java.yz.day16;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

//通过反射获取成员变量并使用
/*
    获取所有成员
            getFields,getDeclaredFields
    获取单个成员
            getField,getDeclaredField
    修改成员的值
            set(Object obj,Object value)
            将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

 */
public class ReflexDemo3 {
    public static void main(String[] args) throws Exception{
        //创建class对象
        Class<?> aClass = Class.forName("com.java.yz.day16.Student");

        //获取所以的成员(这里只能获取到所有的被public修饰的成员)
//        Field[] fields = aClass.getFields();
//        for (Field field : fields) {
//            System.out.println(field);
//            //public int com.java.yz.day16.Student.age
//        }

        //这里可以获取到所有的成员（包括私有的）
//        Field[] declaredFields = aClass.getDeclaredFields();
//        for (Field declaredField : declaredFields) {
//            System.out.println(declaredField);
//        }
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();

        //Field name = aClass.getField("name");
          Field age = aClass.getField("age");  //只有public才能用getField（）
          Field sex = aClass.getDeclaredField("sex");  //其余的都用getDeclaredField()
//        Field name = aClass.getDeclaredField("name");
//        System.out.println(age);
//        System.out.println(name);
//        System.out.println(sex);

        //修改成员的值
        //set(Object obj,Object value)
        //将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
        //如何给成员变量赋值
        //void set(object obj, 0bject value)
        //将指定对象参数上的此 Field对象表示的字段设置为指定的新值。like.set();
        age.set(o,18);


        sex.setAccessible(true);
        //因为sex是私有的，所以就要暴力访问
        sex.set(o,true);
        //给对象o中的成员变量age赋值18

        System.out.println(o);





    }
}
